001 /* 002 * Copyright 2006 Stephen McConnell. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package net.dpml.http; 017 018 import net.dpml.logging.Logger; 019 020 import net.dpml.metro.PartsManager; 021 import net.dpml.metro.ComponentHandler; 022 import net.dpml.component.Provider; 023 024 /** 025 * A collection of handlers. 026 * For each request, all handler are called, regardless of 027 * the response status or exceptions. 028 * @author <a href="http://www.dpml.net">Digital Product Meta Library</a> 029 * @version 0.0.3 030 */ 031 public class HandlerCollection extends org.mortbay.jetty.handler.HandlerCollection 032 { 033 /** 034 * Internal parts management interface. 035 */ 036 public interface Parts extends PartsManager 037 { 038 } 039 040 private final Logger m_logger; 041 private final Parts m_parts; 042 043 /** 044 * Creation of a new handler collection. 045 * @param logger the assigned logging channel 046 * @param parts the parts manager 047 * @exception Exception if an instantiation error occurs 048 */ 049 public HandlerCollection( Logger logger, Parts parts ) throws Exception 050 { 051 super(); 052 053 m_logger = logger; 054 m_parts = parts; 055 056 getLogger().debug( "commencing handler addition" ); 057 String[] keys = parts.getKeys(); 058 getLogger().debug( "handler count: " + keys.length ); 059 for( int i=0; i<keys.length; i++ ) 060 { 061 String key = keys[i]; 062 ComponentHandler handler = parts.getComponentHandler( key ); 063 getLogger().info( "adding handler: " + handler ); 064 try 065 { 066 Provider provider = handler.getProvider(); 067 org.mortbay.jetty.Handler ch = 068 (org.mortbay.jetty.Handler) provider.getValue( false ); 069 super.addHandler( ch ); 070 } 071 catch( Throwable e ) 072 { 073 final String error = 074 "Failed to deploy handler: " + handler; 075 throw new Exception( error, e ); 076 } 077 } 078 } 079 080 private Logger getLogger() 081 { 082 return m_logger; 083 } 084 }